using System;
using System.Collections.Generic;
using System.Text;

namespace Lista
{
    class Lista
    {
        Nodo n;
        public Lista() {
            n = null;
        }
        
        public Lista(Lista l) {
            Nodo nodo=null,aux;
            // Recorremos la lista con este puntero:
            aux = l.n;
            // Si la lista esta vacia reservamos memoria:
            if (n == null && aux!=null)
            {
                n = new Nodo();
                nodo = n;

            }
            while (aux != null) {
                
                
                nodo.Dato = aux.Dato;
                aux = aux.Siguiente;
                if (aux != null)
                {
                    nodo.Siguiente = new Nodo();
                    nodo = nodo.Siguiente;
                }
                else 
                {
                    nodo.Siguiente = null;
                }
                
            }
        }

        public void AnyadeIzquierda(Nodo nodo) {
            if (n == null)
            {
                n = nodo;
            }
            else {
                Nodo aux = nodo;
                aux.Siguiente = n;
                n = aux;
            }
        }

        public void AnyadeDerecha(Nodo nodo) {
            if (n == null)
            {
                n = new Nodo();
                n.Dato = nodo.Dato;
            }
            else
            {
                Nodo aux = n;
                while (aux.Siguiente != null)
                {
                    aux = aux.Siguiente;
                }
                aux.Siguiente = nodo;
            }
        }
        public Nodo GetElemento(int pos) {
            Nodo aux = n;
            for (int i = 0; i < pos; i++) {
                aux = aux.Siguiente;
            }
            return aux;
        }
        public Nodo EliminaIzquierda()
        {
            Nodo aux = null;
            if (n != null)
            {
                aux = n;
                n = n.Siguiente;
                aux.Siguiente = null;
            }
            return aux;
        }
        
        public Nodo EliminaDerecha() {
            Nodo aux = n;
            while (aux.Siguiente.Siguiente != null) {
                 aux = aux.Siguiente;
            }
            Nodo retorno = aux.Siguiente;
            aux.Siguiente = null;
            return retorno;

        }

        public void Imprime() {
            Nodo aux = n;
            while (aux != null) {
                Console.WriteLine(aux.Dato);
                aux = aux.Siguiente;
            }
        }
        public void InsertarEnOrden(Nodo n)
        {

        }

    }
}
